package com.duam.porky.helpers;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.duam.porky.model.Concepto;
import com.duam.porky.model.Movimiento;
import com.duam.porky.model.Usuario;

public class PorkyOpenHelper extends SQLiteOpenHelper 
{
	private static final int DATABASE_VERSION = 2;
	
	private static final String DATABASE_NAME = "duam_porky";
	
    private static final String USUARIOS_TABLE_CREATE =           
    		"CREATE TABLE " + Usuario.TABLE_NAME + " (" +
                Usuario.COLUMN_ID + " INT, " +
                Usuario.COLUMN_NOMBRE_APELLIDO + " VARCHAR(100)," +
                Usuario.COLUMN_NOMBRE_USUARIO + " VARCHAR(100)," +
                Usuario.COLUMN_CLAVE + " VARCHAR(100));";
    
    private static final String CONCEPTOS_TABLE_CREATE = 
    		"CREATE TABLE "+ Concepto.CONCEPTOS_TABLE_NAME +" ("+
    				Concepto.COLUMN_ID +" INT, "+
    				Concepto.COLUMN_USUARIO_ID +" INT, "+
    				Concepto.COLUMN_NOMBRE +" VARCHAR(100), "+
    				Concepto.COLUMN_FACTOR +" INT);";
    
    private static final String MOVIMIENTOS_TABLE_CREATE = 
    		"CREATE TABLE "+ Movimiento.TABLE_NAME +" ("+
    				Movimiento.COLUMN_ID +" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "+
    				Movimiento.COLUMN_CONCEPTO_ID +" INT, "+
    				Movimiento.COLUMN_FECHA +" DATE, "+
    				Movimiento.COLUMN_DETALLE +" VARCHAR(500), "+
    				Movimiento.COLUMN_IMPORTE +" FLOAT);";
    
	public PorkyOpenHelper(Context context) 
	{
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		db.execSQL(USUARIOS_TABLE_CREATE);
		db.execSQL(CONCEPTOS_TABLE_CREATE);
		db.execSQL(MOVIMIENTOS_TABLE_CREATE);
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) 
	{
	}
	
	public void addUsuario(Usuario usuario) 
	{
	    SQLiteDatabase db = this.getWritableDatabase();
	 
	    ContentValues values = new ContentValues();
	    values.put(Usuario.COLUMN_ID, usuario.getId());
	    values.put(Usuario.COLUMN_NOMBRE_APELLIDO, usuario.getNombreApellido());
	    values.put(Usuario.COLUMN_NOMBRE_USUARIO, usuario.getNombreUsuario());
	    values.put(Usuario.COLUMN_CLAVE, usuario.getClave());
	 
	    // Inserting Row
	    db.insert(Usuario.TABLE_NAME, null, values);
	    db.close(); // Closing database connection
	}

	public void addConcepto(Concepto concepto)
	{
		SQLiteDatabase db = this.getWritableDatabase();
		
		db.insert(Concepto.CONCEPTOS_TABLE_NAME, null, values(concepto));
		db.close();
	}
	
	private ContentValues values(Concepto concepto)
	{
		ContentValues values = new ContentValues();
		values.put(Concepto.COLUMN_ID, concepto.getId());
		values.put(Concepto.COLUMN_USUARIO_ID, concepto.getUsuarioId());
		values.put(Concepto.COLUMN_NOMBRE, concepto.getNombre());
		values.put(Concepto.COLUMN_FACTOR, concepto.getFactor());
		
		return values;		
	}
	
	public void insertConceptosWithProgress(List<Concepto> conceptos)
	{
		SQLiteDatabase db = this.getWritableDatabase();
		db.beginTransaction();

		try
		{
			for (Concepto c : conceptos)
			{
				db.insert(Concepto.CONCEPTOS_TABLE_NAME, null, values(c));
				itemProccesed();
			}
			db.setTransactionSuccessful();
		}
		catch (Exception ex)
		{
			Log.e(PorkyOpenHelper.class.getName(), "Error insertando conceptos", ex);
		}
		finally
		{
			db.endTransaction();
			db.close();
		}		
	}
	
	protected void itemProccesed() {}
	
	@SuppressLint("SimpleDateFormat")
	public void addMovimiento(Movimiento movimiento)
	{
		SQLiteDatabase db = this.getWritableDatabase();

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		ContentValues values = new ContentValues();
		values.put(Movimiento.COLUMN_CONCEPTO_ID, movimiento.getConceptoId());
		values.put(Movimiento.COLUMN_DETALLE, movimiento.getDetalle());
		values.put(Movimiento.COLUMN_FECHA, sdf.format(movimiento.getFecha()));
		values.put(Movimiento.COLUMN_IMPORTE, movimiento.getImporte());
		
		db.insert(Movimiento.TABLE_NAME, null, values);
		db.close();		
	}
	
	public Usuario getUsuario(String nombreUsuario)
	{
		Usuario usuario = null;
		SQLiteDatabase db = this.getReadableDatabase();		
		Cursor cursor = db.query(Usuario.TABLE_NAME, new String[]{Usuario.COLUMN_ID, Usuario.COLUMN_NOMBRE_APELLIDO, Usuario.COLUMN_NOMBRE_USUARIO, Usuario.COLUMN_CLAVE}
									, Usuario.COLUMN_NOMBRE_USUARIO +" = ?", new String[]{nombreUsuario}, null, null, null);
		
		if (cursor.moveToFirst())
		{
			usuario = new Usuario();
			usuario.setId(cursor.getInt(0));
			usuario.setNombreApellido(cursor.getString(1));
			usuario.setNombreUsuario(cursor.getString(2));
			usuario.setClave(cursor.getString(3));
		}
		cursor.close();
		db.close();
		
		return usuario;
	}
	
	@SuppressLint("SimpleDateFormat")
	public List<Movimiento> getAllMovimientos(Usuario usuario) throws ParseException
	{
		List<Movimiento> movimientos = new ArrayList<Movimiento>();
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery("select m.fecha, m.concepto_id, m.detalle, m.importe, m.id " +
				"from movimientos m, conceptos c " +
				"where m.concepto_id = c.id and c.usuario_id = ?", new String[]{usuario.getId().toString()});
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		if (cursor.moveToFirst())
		{
			do
			{
				Movimiento movimiento = new Movimiento();
				movimiento.setFecha(sdf.parse(cursor.getString(0)));
				movimiento.setConceptoId(cursor.getInt(1));
				movimiento.setDetalle(cursor.getString(2));
				movimiento.setImporte(cursor.getFloat(3));
				movimiento.setId(cursor.getInt(4));
				
				movimientos.add(movimiento);
			}
			while(cursor.moveToNext());
		}
		cursor.close();
		db.close();
		
		return movimientos;
	}
	
	public Boolean hasConceptos(Usuario usuario)
	{
		Boolean hasConceptos = false;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery("SELECT count(*) FROM "+ Concepto.CONCEPTOS_TABLE_NAME +" WHERE usuario_id = ?", new String[]{usuario.getId().toString()});
		
		hasConceptos = cursor.moveToFirst() && (cursor.getInt(0) > 0);

		cursor.close();
		db.close();
		
		return hasConceptos;
	}
	
	public List<Concepto> getAllConceptos(Usuario usuario)
	{
		List<Concepto> conceptos = new ArrayList<Concepto>();
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery("SELECT id, usuario_id, nombre, factor FROM "+ Concepto.CONCEPTOS_TABLE_NAME +" WHERE usuario_id = ?", new String[]{usuario.getId().toString()});
		
		if (cursor.moveToFirst())
		{
			do
			{
				Concepto concepto = new Concepto();
				concepto.setId(cursor.getInt(0));
				concepto.setUsuarioId(cursor.getInt(1));
				concepto.setNombre(cursor.getString(2));
				concepto.setFactor(cursor.getInt(3));
				
				conceptos.add(concepto);				
			}
			while (cursor.moveToNext());
		}
		cursor.close();
		db.close();
		
		return conceptos;
	}
	
	public void borrarMovimiento(Movimiento movimiento)
	{
		SQLiteDatabase db = getWritableDatabase();
		
		db.delete(Movimiento.TABLE_NAME, Movimiento.COLUMN_ID +" = ? ", new String[]{movimiento.getId().toString()});
		db.close();
	}
	
	public void borrarConceptos(Usuario usuario)
	{
		SQLiteDatabase db = getWritableDatabase();
		
		Log.d(PorkyOpenHelper.class.getName(), "Borrando los conceptos del usuario "+ usuario.getId());
		db.delete(Concepto.CONCEPTOS_TABLE_NAME, Concepto.COLUMN_USUARIO_ID +" = ?", new String[]{usuario.getId().toString()});
		db.close();
	}
	
}
